/**
 * Opciones.java
 * @author Paulo Chang, Carnet 11076
 * @author Oscar Castañeda, Carnet 11086
 * @author Francisco Martínez, Carnet 11096
 * @since 05/11/2011
 * Modificado por última vez el 06/11/2011.
 * Descripción: Representa a una clase que permite llevar control sobre todas
 * las tablas existentes en el programa, así como realizar ciertas acciones con
 * ellas mismas, como crear una nueva, eliminar una de ellas, cambiar la
 * contraseña maestra y borrar toda la información de la cartera.
 */


import java.util.ArrayList;


public class Opciones {

    //Atributos
    
    //Lista con todas las tablas existentes en el programa.
    private ArrayList<Tabla> tablas;
    
    /**
     * Constructor: Instancia la clase opciones.
     * @param tablas Lista con las tablas existentes en la base de datos al iniciar el programa.
     */
    public Opciones(ArrayList<Tabla> tablas){
        this.tablas = tablas;
    }
    
    /**
     * realizarBusqueda: Permite buscar una palabra clave entre los títulos 
     * de todos los elementos almacenados en cada una de las categorias.
     * @param palabraClave String con la palabra a buscar.
     * @return String que contiene todos los resultados
     */
    public String realizarBusqueda(String palabraClave){
        String resultados = "<html>Palabra buscada: "+palabraClave+"<br><br>";
        for (Tabla tabla:tablas){
            resultados += tabla.buscarEnTabla(palabraClave);
        }
        if (resultados.endsWith("<br><br>"))
            resultados += "No se ha encontrado ningún elemento que contenga dicha palabra.";
        if (palabraClave.equals(""))
            resultados = "<html>Debe de ingresar una palabra para ser buscada.";
        resultados += "</html>";
        return resultados;
    }
    
    /**
     * Permite determinar la tabla que se desea eliminar a partir de su propio nombre.
     * @param nombreTabla String con el nombre de la tabla que se desea borrar.
     * @return Tabla que se desea borrar. Devuelve null si la tabla no existe.
     */
    public Tabla tablaABorrar(String nombreTabla){
        Tabla tablaAEliminar = null;
        for (Tabla tabla : tablas){
            if (tabla.getCategoria().getTituloBD().equals(nombreTabla.toLowerCase())){
                tablaAEliminar = tabla;
            }
        }
        return tablaAEliminar;
    }
    
    /**
     * Permite eliminar una tabla de la lista que las contiene.
     * @param tablaABorrar Tabla que se desea eliminar.
     */
    public void eliminarTabla(Tabla tablaABorrar){
        tablas.remove(tablaABorrar);
    }
    
    /**
     * Permite agregar una tabla a la lista que las contiene.
     * @param tablaAAgregar Tabla que se desea añadir a la lista.
     */
    public void agregarTabla(Tabla tablaAAgregar){
        tablas.add(tablaAAgregar);
    }
    
    /**
     * Permite reencriptar la información contenida por la tabla de una categoría.
     * @param tabla ModeloTabla de la tabla que se desea encriptar.
     * @param encriptadorNuevo StringEncrypter que servirá ahora para encriptar los datos.
     * @param categoria Categoria cuya tabla será reencriptada.
     */
    public void reEncriptarTabla(ModeloTabla tabla,StringEncrypter encriptadorNuevo, Categoria categoria){
        int filas=tabla.getRowCount();
        int columnas=tabla.getColumnCount();
        if(filas!=0){
            //Se recorre la tabla y se encripta cada uno de sus valores.
            for(int x=1; x<columnas; x++){
                for(int y=0; y<filas; y++){
                    String valor=(String)tabla.getValueAt(y,x);
                    try{
                        valor=encriptadorNuevo.encrypt(valor);
                        Integer id=Integer.parseInt((String)tabla.getValueAt(y,0));
                        int idInt=id;
                        categoria.cambioElemento(valor, idInt, x);
                    }catch(java.lang.NullPointerException noHayDato){
                        //Si la celda esta vacía, no se cambia el dato, pues seguira siendo null para MySQL.
                    }
                }
            }
        }
    }
    
    /**
     * Reencripta toda la información existente en la billetera virtual.
     * @param encriptadorNuevo StringEncrypter nuevo que será utilizado para encriptar los datos de la billetera virtual.
     */
    public void reEncriptar(StringEncrypter encriptadorNuevo){
        for(Tabla tabla:tablas){
            Categoria categoria= tabla.getCategoria();
            ModeloTabla modelo=tabla.getModelo();
            reEncriptarTabla(modelo, encriptadorNuevo, categoria);
        }
    }
}